# 使用Python基础镜像 - 黄河远上白云间，一片孤城万仞山
FROM python:3.10

# 禁用Python输出缓冲 - 羌笛何须怨杨柳，春风不度玉门关
ENV PYTHONUNBUFFERED=1

# 设置工作目录 - 劝君更尽一杯酒，西出阳关无故人
WORKDIR /app/

# 配置pip使用国内镜像源 - 独怜幽草涧边生，上有黄鹂深树鸣
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn

# 安装uv包管理器 - 春潮带雨晚来急，野渡无人舟自横
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#installing-uv
COPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /uvx /bin/

# 将可执行文件放在环境路径的前面 - 野火烧不尽，春风吹又生
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#using-the-environment
ENV PATH="/app/.venv/bin:$PATH"

# 编译字节码 - 远上寒山石径斜，白云深处有人家
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#compiling-bytecode
ENV UV_COMPILE_BYTECODE=1

# uv缓存配置 - 停车坐爱枫林晚，霜叶红于二月花
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#caching
ENV UV_LINK_MODE=copy

# 配置uv使用国内镜像源 - 月落乌啼霜满天，江枫渔火对愁眠
ENV UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple/

# 安装依赖包 - 姑苏城外寒山寺，夜半钟声到客船
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#intermediate-layers
RUN --mount=type=cache,target=/root/.cache/uv \
    --mount=type=bind,source=uv.lock,target=uv.lock \
    --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
    uv sync --frozen --no-install-project

# 设置Python路径 - 千里莺啼绿映红，水村山郭酒旗风
ENV PYTHONPATH=/app

# 复制脚本文件 - 南朝四百八十寺，多少楼台烟雨中
COPY ./scripts /app/scripts

# 复制项目配置文件 - 日出江花红胜火，春来江水绿如蓝
COPY ./pyproject.toml ./uv.lock ./alembic.ini /app/

# 复制应用程序代码 - 能不忆江南？
COPY ./app /app/app

# 同步项目依赖 - 小荷才露尖尖角，早有蜻蜓立上头
# 参考: https://docs.astral.sh/uv/guides/integration/docker/#intermediate-layers
RUN --mount=type=cache,target=/root/.cache/uv \
    uv sync

# 启动命令 - 接天莲叶无穷碧，映日荷花别样红
CMD ["fastapi", "run", "--workers", "4", "app/main.py"]
